Tengo una nueva aplicación web y he escrito un migrador para crear una tabla de usuarios. Sin embargo, no importa lo que intente, typeorm no parece encontrar este migrador y, por lo tanto, no lo ejecuta.
Mi estructura de archivos (no se muestran otros archivos/carpetas):
├── Server │ ├── dist | | ├── Migrations | | | ├── 1234567891234567890-AddUserTable.js | | | ├── 1234567891234567890-AddUserTable.js.map | | | ├── 1234567891234567890-AddUserTable.d.ts │ ├── src | | ├── Migrations | | | ├── 1234567891234567890-AddUserTable.ts | | ├── app.module.tsaplicación.módulo.ts
@Module({ imports: [ ConfigModule.forRoot({ envFilePath: '.env' }), TypeOrmModule.forRootAsync({ imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ type: 'mysql', host: configService.get('TYPEORM_HOST'), port: +configService.get<number>('TYPEORM_PORT'), username: configService.get('TYPEORM_USERNAME'), password: configService.get('TYPEORM_PASSWORD'), database: configService.get('TYPEORM_DATABASE'), synchronize: configService.get('TYPEORM_SYNCHRONIZE'), entities: [__dirname + '/**/*.entity{.ts,.js}'], migrations: [__dirname + '/Migrations/**/*.js'], migrationsRun: false, cli: { migrationsDir: './Migrations', }, }), inject: [ConfigService], }), ], controllers: [], providers: [], }) export class AppModule { constructor(private connection: Connection) {} } Para ejecutar esto, en la ventana de mi consola, escribo: nest start para iniciar mi servidor.
Luego, ejecuto npx typeorm migration:run que obtengo:
query: SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = 'myDB' AND `TABLE_NAME` = 'migrations' query: SELECT * FROM `myDB`.`migrations` `migrations` ORDER BY `id` DESC No migrations are pending Si miro en mi base de datos, veo una tabla de migrations sin entradas dentro.
He intentado eliminar mi archivo de migrador y crearlo de nuevo con una marca de tiempo más reciente y tampoco funciona.
npx typeorm migration:create -n "MyMigratorName"Cualquier ayuda sería muy apreciada.
Para cualquiera que venga aquí en busca de ayuda:
La configuración anterior menciona las migraciones que se encuentran en los archivos js:
migrations: [__dirname + '/Migrations/**/*.js'],
Sin embargo, a partir de la estructura de carpetas, está claro que las migraciones se escriben en archivos ts, no en js.
Para ejecutar migraciones desde ts, siga la forma recomendada oficialmente que se describe aquí:
https://github.com/typeorm/typeorm/blob/master/docs/using-cli.md#if-entities-files-are-in-typescript
Además, en ese caso, no olvide actualizar el blob de migraciones para que sea ts:
migrations: [__dirname + '/Migrations/**/*.ts'],
Si desea ejecutar las migraciones desde archivos js, deberá proporcionar la ubicación desde la carpeta dist después de que los archivos ts se hayan compilado en el formulario js.
Typeorm solo carga la migración desde archivos con extensión js,
En el archivo ormconfig donde configuraste tu conexión;
{ "type": "mysql", "host": "localhost", "port": 3306, "username": "test", "password": "test", "database": "test", "entities": ["entity/*.js"], "migrationsTableName": "custom_migration_table", "migrations": ["migration/*.js"], "cli": { "migrationsDir": "migration" } } "migrations": ["migration/*.js"] : indica que typeorm cargará las migraciones desde el directorio de "migración" dado.
si su carpeta de migración está almacenada en un directorio dist o src,
"migrations": ["migration/*.js"] ahora será "migrations": ["dist/migration/*.js"] o "migrations": ["src/migration/*.js"] , el * significa cualquier nombre de archivo de migración. Solo asegúrese de que el directorio o los directorios colocados aquí ["migration/*.js"] conduzcan a donde están sus archivos de migración
"migrationsDir": "migration" : indica que la CLI debe crear nuevas migraciones en el directorio "migration". así que cualquier directorio que especifique aquí es donde se crearán sus archivos de migración.
Tenga en cuenta que si sus archivos de migración tienen extensiones mecanografiadas (.ts), debe compilar sus archivos de migración en archivos javascript; si no, typeorm no los encontrará.
Además de la respuesta dada por @Upka Uchechi
Si está utilizando mecanografiado, debe ejecutar los siguientes comandos
$ npm run build # This will compile the typescript files into JavaScript files $ npm run typeorm -- migration:run Para dar un poco más de contexto. Si sus archivos de configuración se ven en <PROJECT ROOT>/db-migrations , el comando de compilación anterior debería mover los archivos JavaScript compilados a <PROJECT ROOT>/dist/db-migrations . Para eso, su archivo de configuración se vería así
... "migrations": ["dist/db-migrations/*.js"], ...